package com_.dxy_test_.param_transfer_;

/**
 * @Description 参数传递测试
 * @Author dangxianyue
 * @Date 2024/1/28 17:04
 */
public class ParamTransferTest {

    // 在编程语言中，值传递（Pass by Value）和引用传递（Pass by Reference）是两种传递参数的方式，它们描述了参数在方法调用时如何传递到被调用方法中。
    //
    // 值传递（Pass by Value）：
    //
    // 在值传递中，实际参数的值被传递给了方法的形式参数。
    // 当你传递基本数据类型（如int、float、char等）时，传递的是实际的值，而不是变量的引用。
    // 在方法内对形式参数的修改不会影响到实际参数。


    // 引用传递（Pass by Reference）：
    //
    // 在引用传递中，实际参数的地址（引用）被传递给了方法的形式参数。
    // 当你传递对象（非基本数据类型，如数组、类的实例等）时，传递的是对象的引用，而不是对象的拷贝。
    // 在方法内对形式参数的修改会影响到实际参数，因为它们指向同一个对象。


    // 在Java中，传递方式是值传递。即使在传递对象时，也是传递对象的引用的拷贝，而不是对象本身。
    // 这意味着在方法内对引用的修改不会影响到实际参数引用的对象，但对于对象内部的状态的修改会被保留。
    // 这是因为引用的拷贝仍然指向相同的对象。


    /*
     * 1、对于基本数据类型：直接拷贝值
     * 2、对于对象或者数组：拷贝的是引用（注意不是直接传递引用）
     *
     * 参考：【面试题精讲】为什么 Java 只有值传递？
     * https://cloud.tencent.com/developer/article/2340757
     */

    public static void main(String[] args) {
        int x = 10;
        modifyValue(x);
        System.out.println("After modifyValue: " + x);  // 输出结果是：After modifyValue: 10

        StringBuilder str = new StringBuilder("Hello");
        modifyReference(str);
        System.out.println("After modifyReference: " + str);  // 输出结果是：After modifyReference: HelloWorld
    }

    private static void modifyValue(int num) {
        num = num + 5;
    }

    private static void modifyReference(StringBuilder s) {
        s.append("World");
    }
}
